package org.liang.job.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.liang.job.GroupManager;
import org.liang.job.beans.Group;
import org.liang.job.repository.GroupRepository;

/**
 * 任务组、触发器组维护器抽象基类.
 * 
 * <pre>
 * 抽象任务组，触发器组共同行为：
 *  1. 判断组名称是否已经存在
 *  2. 添加 组
 *  3. 根据编号删除任务组
 *  4. 根据编号删除组（批量）
 *  5. 根据id更新组名称
 *  6. 获取所有组信息
 *  7. 根据名称查询组信息（模糊查询）
 * </pre>
 *
 * @author L.Yang
 * @version 1.0, 2015年10月16日
 */
abstract class GroupManagerAbstr implements GroupManager {

    /** ID 字段字符串 . */
    private static final String COLUMN_ID = "ID";

    /** NAME 字段字符串. */
    private static final String COLUMN_NAME = "NAME";

    /**
     * 判断组名称是否已经存在.
     * 
     * @param name
     *            组名称
     * @return 是否已存在
     */
    public boolean checkExistenceByName(String name) {
        return getRepository().isNameExist(name);
    }

    /**
     * 添加 组.
     * 
     * @param name
     *            组名称
     */
    public void add(String name) {
        getRepository().save(name);
    }

    /**
     * 根据编号删除组.<br>
     * 如果组编号被任务引用，则不可删除。
     * 
     * @param id
     *            任务组编号
     * @return 是否删除成功
     */
    public boolean delete(String id) {
        if (getRepository().hasReference(id)) {
        	return false;
        } else {
            int result = getRepository().delete(id);
            return result > 0;
        }
    }

    /**
     * 根据编号删除组.<br>
     * 如果组编号被引用，则不可删除。
     * 
     * @param id
     *            组编号
     * @return 返回删除失败编号
     */
    public List<String> delete(List<String> ids) {
        List<String> refs = getRepository().filterReferences(ids);
        ids.removeAll(refs);
        getRepository().delete(ids);
        return refs;
    }

    /**
     * 根据id更新组名称.
     * 
     * @param id
     *            编号
     * @param name
     *            名称
     * @return 是否更新成功
     */
    public boolean update(String id, String name) {
        int result = getRepository().update(id, name);
        return result > 0;
    }

    /**
     * 获取所有组信息.
     * 
     * @return 所有组信息
     */
    public List<Group> queryAll() {
        List<Map<String, Object>> datas = getRepository().queryAll();
        List<Group> groups = new ArrayList<Group>();
        for (Map<String, Object> data : datas) {
            Group group = new Group();
            group.setId(data.get(COLUMN_ID).toString());
            group.setName(data.get(COLUMN_NAME).toString());
            groups.add(group);
        }
        return groups;
    }

    /**
     * 根据名称查询组信息（模糊查询）.
     * 
     * @return 组信息
     */
    public List<Group> queryByName(String name) {
        List<Map<String, Object>> datas = getRepository().query(name);
        List<Group> groups = new ArrayList<Group>();
        for (Map<String, Object> data : datas) {
            Group group = new Group();
            group.setId(data.get(COLUMN_ID).toString());
            group.setName(data.get(COLUMN_NAME).toString());
            groups.add(group);
        }
        return groups;
    }

    /**
     * 获取 数据查询实例.
     * 
     * @return 数据查询实例
     */
    protected abstract GroupRepository getRepository();
}
